传奇之家 - 传奇开区一条龙服务网站

当前位置:传奇之家 > 开区脚本 > > 详细页面

传奇脚本放错文件等于白写:QFunction-0、Market_Def、QuestDiary 各管什么

传奇脚本放错文件等于白写:QFunction-0、Market_Def、QuestDiary 各管什么

传奇脚本放错文件等于白写:QFunction-0、Market_Def、QuestDiary 各管什么

作者:传奇之家类别:开区脚本

更新:2026-11-06查看次数:168

写脚本最让人上火的情况不是报错,是 M2 一声不响,玩家该触发的地方一点反应都没有。查半天语法,最后发现代码本身没毛病,只是放错了文件。传奇服务端的脚本是按目录分类加载的,同一段 #IF / #ACT,放进 QFunction-0.txt 能跑,塞进 QuestDiary 里就永远不会自己执行。

下面按 Mir200\Envir 目录一个个说清楚,每个位置负责什么触发,再给三段能直接抄的完整代码和一套排查顺序。

一、先认清五个位置的职责

1. MapQuest_def\QFunction-0.txt
全服事件触发。升级、死亡、杀人、杀怪、穿装备、脱装备、英雄升级、复活,这类"玩家做了什么"的事件都从这里进。标签名是引擎写死的,比如 [@PlayLevelUp]、[@KillMonster]、[@TakeOnItems],你不能自己改成 [@升级奖励],改了就没人调用。

2. Market_Def\
NPC 对话脚本。文件名必须写成 NPC名-地图号.txt,例如 元宝使者-3.txt,3 是比奇省的地图号。地图号写错,NPC 会照常站在那,但点开没反应,而且不报错,这个坑每年都有人踩。

3. QuestDiary\
功能脚本仓库,自己不触发,靠 #CALL 调用。适合放多个 NPC 共用的判断和发奖逻辑,改一份全部生效。新人礼包、充值返利、活动开关这类东西放这里最省事。

4. MapEvent.txt
地图坐标事件。玩家走到指定坐标时触发,文件里只写坐标和标签名,真正的判断逻辑还是写在 QFunction-0.txt 里。

5. Robot_def\
机器人定时脚本,整点活动、全服滚动公告、每日清零用这个。它按时间跑,跟玩家动作无关。

判断一段脚本该放哪儿,只看它靠什么触发:玩家动作触发的进 QFunction-0,点 NPC 触发的进 Market_Def,到点执行的进 Robot_def,被别的脚本调用的放 QuestDiary。

二、QFunction-0.txt:三个高频触发

升级奖励,只给一次,所以条件要写成等级等于,不要写大于:

[@PlayLevelUp]
#IF
CHECKLEVELEX = 50
#ACT
GIVE 金创药(大) 5
GAMEGOLD + 100
SENDMSG 0 恭喜 <$USERNAME> 冲到 50 级,全服红包已发!

说明:<$USERNAME> 是人物名变量,直接用,别加引号;SENDMSG 0 是全服公告,1 是当前地图,6 是只提示自己。写成 CHECKLEVELEX > 49 的话,51 级、52 级还会继续发,奖励就变刷了。

杀怪给元宝,注意控制数值,这个触发是每杀一只都跑一次:

[@KillMonster]
#IF
CHECKLEVELEX > 39
#ACT
GAMEGOLD + 1
SENDMSG 6 击杀 <$CURRTARGETNAME>,元宝 +1。

说明:<$CURRTARGETNAME> 是刚死那只怪的名字,写在提示里玩家体验会好很多。低等级地图的怪刷新快,单价一定要压低,不然一晚上就能刷出通胀。

穿戴装备触发,适合做极品装备的全服播报:

[@TakeOnItems]
#IF
CHECKITEMW 屠龙 1
#ACT
SENDMSG 0 <$USERNAME> 已经手持屠龙,路过的兄弟让一让。

说明:CHECKITEMW 判断背包或身上是否有该物品,穿上之后才会命中。全服公告只用于真正稀有的装备,普通装备也这么写,公屏会被刷爆。

三、Market_Def:一个能用的兑换 NPC

新建文本文件,命名 元宝使者-3.txt,放进 Market_Def 目录,内容如下:

[@main]
#SAY
<$USERNAME>,今天想换点什么?\ \
<元宝换金币/@gold>    <积分换元宝/@point>    <离开/@exit>

[@gold]
#IF
CHECKGAMEGOLD > 999
#ACT
GAMEGOLD - 1000
GIVE 金币 1000000
SENDMSG 6 兑换完成,1000 元宝换 100 万金币。
#ELSEACT
SENDMSG 6 元宝不足 1000,先去打怪。

几个参数别写错:\ \ 是对话换行;尖括号里前半截是玩家看到的文字,后半截是点击后跳转的标签;@exit 是引擎内置的关闭对话标签,不要自己再定义一遍。最容易被忽略的是 #ELSEACT,只写 #ACT 的话,元宝不够的玩家点下去毫无反应,还以为是脚本坏了。

四、QuestDiary 复用与地图触发

把公共逻辑单独放一个文件,比如 QuestDiary\公共函数.txt:

[@发奖励]
#IF
CHECKLEVELEX > 9
#ACT
GIVE 金币 10000
SENDMSG 6 新人礼包已发放。

任何 NPC 里加一行就能调用,不用复制粘贴:

#CALL [\QuestDiary\公共函数.txt] @发奖励

地图事件则写在 Envir\MapEvent.txt,一行一个触发点,六个字段用 Tab 分开:

3	330	330	3	0	@比奇传送

依次是:地图号、坐标 X、坐标 Y、范围、触发类型、标签。触发类型 0 是进入、1 是离开,个别引擎版本有差异,改完看 M2 加载日志能确认。标签内容仍然写在 QFunction-0.txt:

[@比奇传送]
#IF
CHECKLEVELEX < 10
#ACT
SENDMSG 6 10 级以前不能进比奇,先去新手村练级。
MAPMOVE 0 289 618

这里逻辑是反的:等级小于 10 才执行拦截并把人物送回新手村,10 级以上条件不成立,脚本自然结束,玩家正常进图。

五、常用变量和命令速查

变量:<$USERNAME> 人物名、<$LEVEL> 等级、<$GAMEGOLD> 元宝、<$GAMEPOINT> 积分、<$MAP> 当前地图、<$X> 与 <$Y> 坐标、<$CURRTARGETNAME> 当前目标名。

容器:N0-N99 存数字,S0-S99 存字符,[000]-[999] 是开关变量,只有 0 和 1。用 MOV 赋值、INC 加、DEC 减、MUL 乘、DIV 除。

判断:CHECK 查开关、CHECKITEMW 查物品、CHECKGAMEGOLD 查元宝、CHECKGAMEPOINT 查积分、CHECKLEVELEX 查等级、CHECKMAPNAME 查地图。

执行:GIVE 给物品、TAKE 收物品、GAMEGOLD 增减元宝、GAMEPOINT 增减积分、MAPMOVE 传送、DELAYGOTO 延时跳转、BREAK 结束当前段、CLOSE 关闭对话。

六、脚本不生效,按这个顺序查

1. 打开 M2 启动日志,搜 Script Error,后面的行号是相对当前文件的,不是整个服务端的行号。
2. 检查文件编码,必须是 ANSI(GBK)。用记事本另存成 UTF-8 之后,中文标签会读成乱码,整段直接不加载,也不一定有明显报错。
3. 标签 [@xxx] 和 #IF、#ACT 都要顶格写,前面多一个空格,引擎就当普通文字跳过了。
4. MapEvent.txt 里只写坐标和标签,判断条件必须回到 QFunction-0.txt,写在事件文件里不生效,这也是地图触发最容易漏的一步。
5. 改完要重载脚本,M2 里重新加载 NPC 与脚本,或者直接重启 M2。保存文件不等于生效,这一步漏掉的人最多。
6. NPC 不出现或者点不开,回头检查文件名里的地图号,名字和地图号之间是英文短横线。

七、两个容易翻车的细节

第一,N、S、[] 这些变量都存在内存里,M2 一重启就归零。要做累积充值、累计在线这类需要长期保留的数据,得用文本记录或引擎自带的全局变量功能,不能只靠 [101] 这种开关。

第二,GIVE 给金币单次不要超过 21 亿,超了会变成负数,玩家金币直接清零。大额奖励拆成几次给,或者改用元宝发放。

另外,换引擎时先把积分类命令单独测一遍,GOM、GEE、HGE 大体一致,个别命令名不同,别整套直接搬过去。

脚本这行没有玄学,触发不生效基本就是位置、编码、重载这三件事。把上面的目录对照表存下来,下次写完先对一遍放在哪,比对着 M2 日志猜要快得多。